package main

import (
	"fmt"
	"helloword01/30tcp/tcp02prac/util"
	"io"
	"net"
	"strings"
	"time"
)

func main() {
	//使用的网络协议是tcp 0.0.0.0:8888表示在本地监听8888端口
	listen, err := net.Listen("tcp", "0.0.0.0:8888")
	if err != nil {
		fmt.Println("服务器监听8888失败~")
		return
	}
	//延迟关闭listen
	defer func(listen net.Listener) {
		err := listen.Close()
		if err != nil {
			fmt.Println("服务器关闭失败~")
		}
	}(listen)
	fmt.Println("服务器监听8888:")

	//循环等待客户端连接
	for {
		//等待客户端连接
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("服务器接收连接失败~")
		} else {
			fmt.Printf("[%s]：%s\n", conn.RemoteAddr().String(), "连接成功~")
			//开启一个协程处理客户端连接
			go process(conn)
		}
	}
}

// process
//
//	@Description: 协程处理客户端的连接
//	@param conn
func process(conn net.Conn) {
	defer func(conn net.Conn) {
		err := conn.Close()
		if err != nil {
			fmt.Printf("[%s]：%s\n", conn.RemoteAddr().String(), "关闭失败")
		}
	}(conn)

	//循环的接收数据
	for {

		text, err := util.ReadPkgWithLength(conn)
		if err != nil {
			if err == io.EOF {
				fmt.Printf("[%s]：%s\n", conn.RemoteAddr().String(), "客户端退出")
				return
			}
			fmt.Printf("[%s]：%s\n", conn.RemoteAddr().String(), "客户端退出")
			return
		}
		fmt.Printf("[%s]：%s", conn.RemoteAddr().String(), text)

		//获取回复语句
		res := getResText(text)
		err = util.WritePkgWithLength(conn, res)
		fmt.Printf("[服务端]：%s\n", res)
	}
}

// getTextMap
//
//	@Description: 数据库
//	@return map[string]string
func getTextMap() map[string]string {
	return map[string]string{
		"hello": "hi",
		"hi":    "hello",
		"time":  time.Now().Format("2006-01-02 15:04:05"),
		"net":   "ncc.douxuedu.com",
	}
}

func getResText(text string) string {
	textMap := getTextMap()
	replay, ok := textMap[strings.TrimSpace(text)]
	if ok {
		return replay
	} else {
		return strings.TrimSpace(text)
	}
}
